package com.ruoyi.app.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.ruoyi.app.domain.AppUser;
import com.ruoyi.app.domain.bo.AppUserBo;
import com.ruoyi.app.domain.bo.SetAppParentBo;
import com.ruoyi.app.domain.vo.AppUserSettingVo;
import com.ruoyi.app.domain.vo.AppUserVo;
import com.ruoyi.app.domain.vo.UserResultVo;
import com.ruoyi.app.domain.vo.UserVo;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.page.TableDataInfo;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;

/**
 * APP用户信息Service接口
 *
 * @author ruoyi
 * @date 2025-11-30
 */
public interface IAppUserService {

    /**
     * 根据用户ID查询APP用户信息
     */
    AppUserVo queryById(Long id);


    /**
     * 根据身份证号查询用户
     * @param code 身份证号
     * @return
     */
    List<AppUserVo> queryByCode(String code);


    /**
     * 根据用户ID查询APP用户信息
     */
    List<AppUserVo> queryByPid(Long id);

    /**
     * 查询用户详细信息
     *
     * @param id 用户ID
     * @return
     */
    UserVo queryByIdUserVo(Long id);

    /**
     * 过滤用户信息
     */
    UserResultVo filterateUserVo(AppUserVo user);

    UserResultVo filterateUserVo(Long userId);

    /**
     * 查询用户基本信息
     *
     * @param id 用户ID
     * @return
     */
    UserVo userVo(Long id);

    /**
     * 查询用户信息
     *
     * @param phone 电话
     * @return
     */
    AppUserVo queryByPhone(String phone);

    /**
     * 根据唯一码查询用户信息
     * @param uniqueCode 设备唯一编码
     * @return
     */
    AppUserVo queryByUniqueCode(String uniqueCode);

    /**
     * 查询用户昵称
     *
     * @param name 昵称
     * @return
     */
    AppUserVo queryNickName(String name);

    /**
     * 根据邀请码查询用户
     *
     * @param code 邀请码
     * @return
     */
    AppUserVo queryByInviteCode(String code);

    /**
     * 查询用户信息列表
     *
     * @param bo 对象信息
     * @return
     */
    List<AppUserVo> selectList(AppUserBo bo);


    /**
     * 查询用户信息列表
     *
     * @return
     */
    List<AppUserVo> selectList(LambdaQueryWrapper<AppUser> lambdaQueryWrapper);

    /**
     * 查询APP用户信息列表
     */
    TableDataInfo<AppUserVo> queryPageList(AppUserBo bo, PageQuery pageQuery);


    /**
     * 查询APP用户信息列表
     */
    TableDataInfo<AppUser> queryPage(AppUserBo bo, PageQuery pageQuery);


    /**
     * 查询APP用户信息列表
     */
    List<AppUserVo> queryList(AppUserBo bo);


    List<AppUserVo> queryList(LambdaQueryWrapper<AppUser> wrapper);

    /**
     * 查询APP用户信息列表
     */
    List<AppUser> queryListUser(AppUserBo appUserBor);

    /**
     * 查询APP用户信息列表
     */
    List<AppUserVo> queryListOrder(AppUserBo bo);

    /**
     * 根据条件匹配用户
     *
     * @param settingVo 条件信息
     * @return
     */
    List<AppUserVo> queryList(AppUserSettingVo settingVo, Set<Long> noLikeIds);

    /**
     * 根据条件匹配用户
     *
     * @param setting 条件信息
     * @return
     */
//    List<AppUserVo> queryList(AppLikeSettingVo setting, List<Long> ids);


    /**
     * 查找APP用户信息
     *
     * @param bo 查询条件
     * @return
     */
    List<AppUserVo> findList(AppUserBo bo);


    /**
     * 模糊查找APP用户信息
     *
     * @param bo 查询条件
     * @return
     */
    List<AppUserVo> findNameList(AppUserBo bo);


    /**
     * 新增APP用户信息
     */
    Boolean insertByBo(AppUserBo bo);

    /**
     * 新增APP用户
     *
     * @param user 用户对象
     * @return
     */
    Boolean insert(AppUserVo user);

    /**
     * 修改APP用户信息
     */
    Boolean updateByBo(AppUserBo bo);

    Boolean updateByVo(AppUserVo vo);

    Boolean update(LambdaUpdateWrapper<AppUser> wrapper);

    /**
     * 批量修改APP用户在线状态
     */
    Boolean updates(List<AppUserVo> appUserVos);

    /**
     * 校验并批量删除APP用户信息信息
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);

    /**
     * 获取邀请码和邀请信息
     *
     * @param userId 当前用户ID
     * @return
     */
    HashMap<String, Object> inviteCode(Long userId);

    /**
     * 修改用户密码
     *
     * @param userId   用户ID
     * @param password 用户密码
     * @return
     */
    Boolean updatePassword(Long userId, String password);

    /**
     * 修改上级用户关系
     *
     * @param userId
     * @param parentId
     * @return
     */
    Boolean updateParent(Long userId, Long parentId);

    /**
     * 修改上级关系，增加邀请奖励
     *
     * @param userId
     * @param parentId
     * @return
     */
    Boolean updateParentAndAward(Long userId, Long parentId);

    /**
     * 修改用户的环信UUID
     *
     * @param userId 用户ID
     * @param uuid   环信的UUID
     * @return
     */
    Boolean updateUuid(Long userId, String uuid);

    /**
     * 修改用户的状态
     *
     * @param userId 用户ID
     * @return
     */
    Boolean updateStatus(Long userId, String status);

    /**
     * 修改用户信息
     *
     * @param bo 用户信息对象
     * @return
     */
    Boolean updateInfo(AppUserBo bo);

    UserVo setUserInfo(Long id, Long userId);


    /**
     * 修改用户的在线状态
     *
     * @param id 用户ID
     * @return
     */
    Boolean updateOnline(Long id);

    /**
     * 批量更新用户的信息
     *
     * @param updates 用户的信息
     * @return
     */
    Boolean update(ArrayList<AppUser> updates);

    /**
     * 直推用户列表
     *
     * @param id 用户ID
     * @return
     */
    List<AppUserVo> zhituiList(Long id);


    /**
     * 间推用户列表
     *
     * @param id 用户ID
     * @return
     */
    List<AppUserVo> jiantuiList(Long id);


    /**
     *  推荐的1，2级全部用户列表
     * @param id 用户ID
     * @return
     */
    List<AppUserVo> allList(Long id);

    /**
     * 查询用户的所有上级ID
     * @param userId 用户ID
     * @return
     */
    List<Long> findAllParentIds(Long userId);

    /**
     * 更新当前用户和他上级用户的等级
     * @param userId 用户ID
     */
    Boolean updateUseLevel(Long userId);

    void recommendedRewards(Long id, String ztRewards, String jtRewards);

    /**
     * 看广告推荐奖励
     * @param id 用户ID
     * @param integral 奖励
     */
    void adRewards(Long id, BigDecimal integral);

    /**
     * 爬塔推荐奖励
     * @param id 用户ID
     * @param integralk 奖励
       @param name 爬塔名称
     */
    void paTaRewards(Long id, BigDecimal integralk,String name);

    /**
     * 任务包推荐奖励
     * @param id 用户id
     * @param income 奖励
     * @param packageName 任务包名称
     */
    void pageOrderRewards(Long id, BigDecimal income, String packageName);

    List<AppUser> selToday(LocalDateTime startOfDay, LocalDateTime endOfDay);

    int setParent(SetAppParentBo bo);

    HashMap<String, Object> inviteCodeImage(Long id);


    /**
     * 是否满足日活2人
     * @param id
     * @return
     */
    boolean isManRiHuo(Long id);

    /**
     * 修改密码
     * @param id
     * @param password
     */
    void setPassWord(Long id, String password);


    /**
     * 查询用户
     * @param keyWord
     * @return
     */
    List<AppUserVo> selUserByPhoneAndId(String keyWord);
}
